iT邦幫忙

2023 iThome 鐵人賽

DAY 26
0
AI & Data

30天胡搞瞎搞學會pyspark系列 第 26

[ Day 26 ] - Pyspark | Performance - 寫在最後的效能議題 : 開發習慣

  • 分享至 

  • xImage
  •  

今天要來談談如何優化妳的程式,在寫code一段時間後,我總是會忍不住問自己,這樣寫是不是比較好,那那樣寫會不會讓我的code跑得更有效率更節省資源呢?特別是你用的服務都是雲端服務時,這個議題可能更加重要(畢竟是使用者付費啊)
那我們今天就來淺談一下,怎麼樣寫,有哪些方法可以優化你的pyspark的資料處理運算效率吧
Pyspark的效能調校將會分為四的主題說明

  1. 開發習慣
  2. 參數調校
  3. 資料傾斜度(Skew)
  4. Shuffle

全文參考學習
https://umbertogriffo.gitbook.io/apache-spark-best-practices-and-tuning/

今天主要會從開發習慣來做闡述,開始囉

開發習慣

1.重複使用RDD,善用persist()

還記得在前幾篇有提到的惰性執行以及持久化DataFrame,惰性執行 代表著我們總是會到最後一步,或是說action運算時,才會真正將運算啟動,前面都只是將你要做的步驟給儲存下來而已,也就是說,使用多個相同的RDD不僅造成空間上的重複呼叫,也會造成效能低落
那怎麼樣才能讓你的code更有效率呢?
這時候就要提到持久化DataFrame,因為有這惰性執行的概念的關係,所有運算步驟都會撐到最後一次才做執行,但當你有很多個步驟時,每一次在呼叫他的時候他都要從頭全部跑一次,所以持久化persist()就出現了,他有點像是幫你存一個tempTable的概念,你就可以重複去取用這個tempTable,也就不用從頭再做一次所有的計算了
那讓我們來看一下一些例子吧

## 效率最差的寫法,同樣的Dataset重複create
####################################
rdd1 = sc.textFile("./hello_world.txt", 4) 
rdd2 = sc.textFile("./hello_world.txt", 4) 
print(rdd1.show(10))
print(rdd2.map(lambda x:x[0:1]).show(10))
####################################################################################
## 效率稍微好一點點,有重複使用同樣的Dataframe,但因為沒有進行持久化處理,導致資料會重複的做運算
####################################
rdd1 = sc.textFile("./hello_world.txt", 4) 
print(rdd1.show(10))
print(rdd1.map(lambda x:x[0:1]).show(10))
####################################################################################
# 使用同一個RDD,且有記得用persist()
####################################
rdd = sc.parallelize(range(1, 11), 4).persist() # 或者cache() 
rdd_map = rdd.map(lambda x: x*2)
rdd_reduce = rdd.reduce(lambda x, y: x+y)
print(rdd_map.show(10))
print(rdd_reduce)
####################################################################################

如果有任何不理解、錯誤或其他方法想分享的話,歡迎留言給我!喜歡的話,也歡迎按讚訂閱!

我是 Vivi,一位在雲端掙扎的資料工程師!我們下一篇文章見!Bye Bye~
【本篇文章將同步更新於個人的 Medium,期待與您的相遇!】


上一篇
[ Day 25 ] - Pyspark | Advance - foreach
下一篇
[ Day 27 ] - Pyspark | Performance - 寫在最後的效能議題 : 參數調校
系列文
30天胡搞瞎搞學會pyspark30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言